package com.lzh.java2;
/*
 * 
 * 类的内部成员之五：
 * 1.Java中允许将一个类A声明在类B中，则类A就是内部类，类B称为外部类
 * 
 * 2.内部类的分类：成员内部类(静态的，非静态的) VS 局部内部类(方法内，代码块内，构造器内)
 * 
 * 3.成员内部类：
 * 		一方面，作为外部类的成员：
 * 			>调用外部类的结构
 * 			>可以被static修饰			
 * 			>可以被四种不同的权限修饰
 * 
 * 		另一方面，作为一个类：
 * 			> 类内可以属性、方法、构造器
 * 			> 可以被final修饰，表示此类不能被继承。言外之意，不使用final，就可以被继承
 * 			>可以被abstract修饰
 * 
 * 4.关注如下三个问题
 * 		4.1如何实例化成员内部类的对象、
 * 		4.2如何在成员内部类中区分外部内部类
 * 		4.3开发中局部内部类的使用《见InnerClassTest1.java》
 * 
 */
public class InnerClassTest {
	
	public static void main(String[] args) {
		
		//创建Dog实例(静态成员内部类)
		Person.Dog dog = new Person.Dog();
		dog.show();
		
		//创建Bird实例(非静态的成员内部类)
//		Person.Bird bird = new Person.Bird();//错误的
		
		Person p = new Person();
		Person.Bird bird = p.new Bird();
		bird.sing();
		
		System.out.println();
		
		bird.display("xiaoxiao");
		
		
	} 
	
}
class Person{
	
	String name = "刘智豪";
	int age;
	
	public void eat() {
		System.out.println("吃饭");
	}
	
	//非静态成员内部类
	class Bird{
		String name = "大黄";
		
		public Bird() {
			
		}
		
		public void sing() {
			System.out.println("我是一只小小鸟");
			Person.this.eat();//调用外部类的非静态属性
		}
		
		public void display(String name) {
			System.out.println(name);//方法的形参
			System.out.println(this.name);//内部类的属性
			System.out.println(Person.this.name);//外部类的属性
		}
	}
	//静态成员内部类
	static class Dog{
		
		String name;
		int age;
		
		public void show() {
			System.out.println("卡拉是条狗");
//			eat();
		}
		
	}
	
	public void method() {
		//局部内部类
		class AA{
			
		}
	}
	
	{
		//局部内部类
		class BB{
			
		}
	}
	
	public Person() {
		//局部内部类
		class CC{
			
		}
		
	}
	
}
